package tool;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @ClassName tool.DownLoadThread
 * @Description TODO
 * @Author LYJ
 * @Date 2018/12/22 15:09
 * @Verison 1.0
 **/
public class DownLoadThread implements Runnable{

    private long start;
    private File src;
    private long total;
    private File desc;

    /**
     *
     * @param start
     *            开始下载的位置
     * @param src
     *            要下载的文件
     * @param desc
     *            要下载的目的地
     * @param total
     *            要下载的总量
     */
    public DownLoadThread(long start, File src, File desc, long total) {
        this.start = start;
        this.src = src;
        this.desc = desc;
        this.total = total;
    }

    @Override
    public void run() {

        try {
            //因为我们要指定位置进行读写，所以要关联RandomAccessFile对象
            RandomAccessFile src = new RandomAccessFile(this.src,"rw");
            RandomAccessFile desc = new RandomAccessFile(this.desc,"rw");



            // 源和目的都要从start开始       (start:开始下载的位置)
            src.seek(start);
            desc.seek(start);

            //开始读写
            byte[] arr = new byte[1024];
            int len; //记录指针位置
            long count = 0;

            //读写操作
            while ((len = src.read(arr)) != -1){
                //分三种情况
                if (len + count > total) {
                    //1.当读取的时候操作自己该线程的下载总量的时候,需要改变len
                    len = (int) (total - count);
                    desc.write(arr, 0, len);
                    //证明该线程下载任务已经完毕,结束读写操作
                    break;
                } else if (len + count < total) {
                    //2.证明还没有到下载总量,直接将内容写入
                    desc.write(arr, 0, len);
                    //并且使计数器任务累加
                    count += arr.length;
                } else {
                    //3.证明改好到下载总量
                    desc.write(arr, 0, len);
                    //结束读写
                    break;
                }

            }
            src.close();
            desc.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
